#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
#include <fcntl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
 
#include "data_type.h"
#include "alloc.h"
#include "memfunc.h"
#include "basefunc.h"
#include "struct_deal.h"
#include "crypto_func.h"
#include "memdb.h"
#include "message.h"
#include "ex_module.h"
#include "sys_func.h"
#include "tcm_constants.h"
#include "tcm_structures.h"
#include "tcmfunc.h"
#include "tcm_cube_struct.h"
#include "tcm_key_manage.h"
#include "tcm_key_desc.h"
#include "tcm_pik_desc.h"
#include "tcm_view.h"
#include "file_struct.h"
#include "sm2.h"
#include "return_value.h"

#include "file_decrypt.h"

int mode =0;
BYTE prikey[DIGEST_SIZE*2];
BYTE pubkey_XY[64];
unsigned long prilen=DIGEST_SIZE*2;
char * prikeyfile=NULL;
char * pubkeyfile=NULL;
BYTE Buf[DIGEST_SIZE*16];
static char defaultkey[DIGEST_SIZE];

int file_decrypt_init(void * sub_proc, void * para)
{
	int ret;
	struct init_struct * init_para=para;
    Memset(defaultkey,0,DIGEST_SIZE);
	Strncpy(defaultkey,init_para->defaultkey,DIGEST_SIZE);
	return 0;
}
int file_decrypt_start(void * sub_proc, void * para)
{
	int ret;
	void * recv_msg;
	int type;
	int subtype;
	
	while(1)
	{
		usleep(time_val.tv_usec);
		ret=ex_module_recvmsg(sub_proc,&recv_msg);
		if(ret<0)
			continue;
		if(recv_msg==NULL)
			continue;
		type=message_get_type(recv_msg);
		subtype=message_get_subtype(recv_msg);
		if(!memdb_find_recordtype(type,subtype))
		{
			printf("message format (%d %d) is not registered!\n",
			message_get_type(recv_msg),message_get_subtype(recv_msg));
			continue;
		}
		// if(message_get_flag(recv_msg) &MSG_FLAG_DECRYPT)
		// {
		// 	printf("1\n");
		// 	proc_file_decrypt(sub_proc,recv_msg);
		// }
		// else if(message_get_flag(recv_msg) &MSG_FLAG_CRYPT)
		// {
		// 	printf("2\n");
        //     proc_file_crypt(sub_proc,recv_msg);
		// }
		if((type==TYPE(FILE_TRANS))&&(subtype==SUBTYPE(FILE_TRANS,FILE_DATA)))
		{
			printf("1\n");
			ret=proc_file(sub_proc,recv_msg);
		}
    else if ((type == TYPE(GENERAL_RETURN))&&(subtype==SUBTYPE(GENERAL_RETURN,UUID))&& (message_get_flag(recv_msg) &MSG_FLAG_VERIFY)){
      printf("I am in decrypter!\n");
			ret=proc_file(sub_proc,recv_msg);
    }
		else
		{
			return 0;
		}
	}
	return 0;
}
// int proc_file_crypt(void * sub_proc,void * message)
// {
// 	int ret;
// 	printf("进入");

// 	RECORD(FILE_TRANS,FILE_DATA) * file_data;
// 	BYTE Namebuf[DIGEST_SIZE*4];

// 	ret=message_get_record(message,&file_data,0);
//     if(ret<0)
// 	{
// 		printf("错误\n");
// 		return -EINVAL;
// 	}	
// 	printf("成功\n");
// 	int cryptlen;
// 	BYTE *crypt_temp;

// 	int crypt_size=file_data->data_size;
// 	printf("加密前输出：%s\n",file_data->file_data);
// 	printf("加密开始\n");

//     cryptlen=sm4_context_crypt(file_data->file_data,&crypt_temp,crypt_size,defaultkey);
// 	printf("加密结束\n");
// 	printf("加密后长度：%d\n",cryptlen);
// 	printf("加密后输出：%x\n",crypt_temp);

// 	BYTE NameBuf[DIGEST_SIZE*4];
// 	BYTE NameBuf1[DIGEST_SIZE*4];
// 	int fd;
// 	int fd1;
// 	BYTE *crypt_temp1;

//     printf("打开文件加密\n");
//     Strcpy(NameBuf,"crypt_file/crypt_");
// 	printf("namebuf：%s\n",NameBuf);
// 	Strcat(NameBuf,file_data->filename);
// 	printf("namebuf：%s\n",NameBuf);
// 	fd=open(NameBuf,O_CREAT|O_WRONLY,0666);
//     printf("等待\n");
// 	if(fd<0)
// 	{
// 		return fd;
// 	}
// 	write(fd,crypt_temp,cryptlen);
// 	close(fd);

//     Strcpy(NameBuf1,"crypt_file/crypt_");
// 	printf("namebuf1：%s\n",NameBuf1);
// 	Strcat(NameBuf1,file_data->filename);
//     printf("namebuf1：%s\n",NameBuf1);

// 	fd1=open(NameBuf1,O_RDONLY);
// 	if(fd1<0)
// 		return fd1;	

// 	read(fd1,crypt_temp1,cryptlen);
// 	close(fd1);
	
// 	BYTE *decrypt_temp;
// 	int decryptlen;
// 	printf("解密前输出：%x\n",crypt_temp1);
// 	printf("解密开始\n");

// 	decryptlen=sm4_context_decrypt(crypt_temp1,&decrypt_temp,cryptlen,defaultkey);
// 	printf("解密结束\n");
// 	printf("解密后长度：%d\n",decryptlen);
// 	printf("解密后输出：%s\n",decrypt_temp);
// }
// int proc_file_crypt(void * sub_proc,void * message)
// {
// 	int ret;
// 	RECORD(FILE_TRANS,FILE_DATA) * file_data;
// 	BYTE NameBuf[DIGEST_SIZE*4];
// 	int cryptlen;
// 	BYTE *crypt_temp;
// 	int fd;

// 	ret=message_get_record(message,&file_data,0);
//     if(ret<0)
// 	{
// 		return -EINVAL;
// 	}	

// 	int crypt_size=file_data->data_size;
// 	printf("加密前输出：%s\n",file_data->file_data);

//     cryptlen=sm4_context_crypt(file_data->file_data,&crypt_temp,crypt_size,defaultkey);

//     Strcpy(NameBuf,"crypt_file/crypt_");
// 	Strcat(NameBuf,file_data->filename);
// 	fd=open(NameBuf,O_CREAT|O_WRONLY,0666);
// 	if(fd<0)
// 	{
// 		return fd;
// 	}
// 	write(fd,crypt_temp,cryptlen);
// 	close(fd);
// 	return 0;

// }
// int proc_file_decrypt(void * sub_proc,void * message)
// {
// 	printf("进入\n");
// 	int ret;
// 	RECORD(FILE_TRANS,FILE_DATA) * file_data;
// 	BYTE NameBuf[DIGEST_SIZE*4];
// 	int fd;
// 	BYTE *crypt_temp;
// 	BYTE *decrypt_temp;
// 	int cryptlen;
// 	int decryptlen;

//     ret=message_get_record(message,&file_data,0);
//     if(ret<0)
// 	{
// 		return -EINVAL;
// 	}	
// 	decryptlen=sm4_context_decrypt(file_data->file_data,&decrypt_temp,file_data->data_size,defaultkey);
// 	printf("解密后输出为：%s\n",decrypt_temp);

// 	return 0;
// }
int proc_file(void * sub_proc,void * message)
{
	void * new_msg;
	int ret;
	MSG_EXPAND * msg_expand;
	RECORD(FILE_TRANS,FILE_DATA) * file_data;
	ret=message_get_expand(message,&msg_expand,0);
    if(ret<0)
	{
		return -EINVAL;
	}
	file_data=msg_expand->expand;
	// if(Strncmp(file_data->filename,"crypt_",6)==0)
	// {
		// int flag=message_get_flag(message);
        // message_set_flag(message,flag|MSG_FLAG_DECRYPT);
		// new_msg=message_create(TYPE_PAIR(FILE_TRANS,FILE_DATA),message);
		// ret=message_add_record(new_msg,file_data);
		// ret=ex_module_sendmsg(sub_proc,new_msg);
	int fd;
	BYTE *decrypt_temp;
	int cryptlen;
	int decryptlen;	
	BYTE NameBuf[DIGEST_SIZE*4];
	decryptlen=sm4_context_decrypt(file_data->file_data,&decrypt_temp,file_data->data_size,defaultkey);
	printf("解密后输出为：%s\n",decrypt_temp);

	Strcpy(NameBuf,"de");
	//Strcat(NameBuf,file_data->filename);
	fd=open(NameBuf,O_CREAT|O_WRONLY,0666);
	if(fd<0)
	{
		return fd;
	}
	write(fd,decrypt_temp,decryptlen);
	close(fd);

	return 0;
	}
// 	else
// 	{
// 		// int flag=message_get_flag(message);
//         // message_set_flag(message,flag|MSG_FLAG_CRYPT);
// 		// new_msg=message_create(TYPE_PAIR(FILE_TRANS,FILE_DATA),message);
// 		// ret=message_add_record(new_msg,file_data);
// 		// ret=ex_module_sendmsg(sub_proc,new_msg);
// 	BYTE NameBuf[DIGEST_SIZE*4];
// 	int cryptlen;
// 	BYTE *crypt_temp;
// 	int fd;
// 	int crypt_size=file_data->data_size;
// 	printf("加密前输出：%s\n",file_data->file_data);

//     cryptlen=sm4_context_crypt(file_data->file_data,&crypt_temp,crypt_size,defaultkey);

//     Strcpy(NameBuf,"crypt_file/crypt_");
// 	Strcat(NameBuf,file_data->filename);
// 	fd=open(NameBuf,O_CREAT|O_WRONLY,0666);
// 	if(fd<0)
// 	{
// 		return fd;
// 	}
// 	write(fd,crypt_temp,cryptlen);
// 	close(fd);
// 	return 0;
// 	}
// 	return ret;
// }